package cn.tedu.mapper;

import cn.tedu.pojo.Student;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;
import java.util.Map;

/**
 * 使用配置文件进行开发
 * 用于定义MyBatis映射student表的接口类
 * 接口类的类名一般情况下,都和定义的数据表的表名对应上,
 * 然后最后以Mapper为结尾,这是行业规范,遵守会提供一个更加
 * 方便的阅读,使用的体验
 */
@Mapper
public interface StudentMapper1 {
    /**
     * ①声明一个接口方法
     * 1.是公开方法
     * 2.方法名: 要求见名知意(查询都会以get、select、query等开头命名,新增一般会以insert、add等开头命名)
     * 3.返回值: 要和绑定的SQL执行的后的结果相关联
     * 3.1如果绑定的是增删改的SQL,返回值可以写void,或者是int
     * 3.2如果绑定的是查询的SQL,返回一条记录,则写封装该记录的实体类类名,如果返回多条记录,则写List,并且封装数据的实体类作为泛型
     * 4.参数: 需要和绑定的SQL所需的参数关联
     * 4.1参数的大原则: 和SQL所需要的参数的类型和参数名一致
     * 4.2参数只有1个时,占位符的名字可以和接口方法的形参不一致,但是类型必须相同
     * 4.3参数为多个时,要求占位符的名字要和接口方法的形参名相同,否则传入不进去
     * 4.4参数为多个时,也可以占位符名起名固定为paramN,然后接口的形参就会依照顺序传值,但是这种方式很少用
     * 4.5如果SQL的参数是日期类型,接口形参可以声明为String类型,MyBatis框架底层会自动转换
     * 4.6如果传入的多个参数,属于一个实体类的属性时,那么可以以实体类作为形参,接受参数,可以大大简化开发成本和阅读体验
     * 注意: 我们通过set方法给实体对象赋值,而MyBatis框架需要根据占位符的名字,调用对应的get方法取值,所以如果占位符名和get方法不一致,会导致取值失败
     * 4.7如果传入的多个参数,不属于一个实体类的属性时,那么可以借助Map容器来接受多个参数,用的很少,不是很方便
     * ②为接口方法绑定SQL(注解方式)
     * 1.如果要绑定查询的SQL,就使用@Select,增删改,就使用@Update,注解使用在要绑定的接口方法上
     * 2.将要绑定的SQL语句,写入到注解中
     * 3.注意!!!接口和SQL的关系必须要严格按照规则绑定,不能修改的SQL使用@Update
     */
    //查询id为1的学生信息
    public Student getStudentById();

    //查询全部的学生信息
    public List<Student> listStudent();

    //新增一条学生记录
    public int addStudent();

    //修改一条学生记录
    public int updateStudent();

    //删除一条学生记录
    public int deleteStudent();

    /**
     * 如果接口方法绑定的SQL语句需要参数,则需要使用接口方法的形参来进行值的传递
     */
    //根据id查询一条学生信息
    public Student selectById(Integer id);

    //基于name查询学生信息
    public Student selectByName(String b);

    //根据gender和job查询指定的学生信息
    public List<Student> selectByGenJob(String c, String d);

    //查询指定的出生日期范围内的记录
    public List<Student> selectByBirth(String minBirth, String maxBirth);

    //新增一个学生的信息
    public int insertStudent(Student student);

    //    public int insertStudent(String name,
//                             Integer age,
//                             String gender,
//                             String job,
//                             String birth,
//                             Integer locationId,
//                             Integer teamLeader,
//                             Integer classId);

    //分页查询
    public List<Student> selectByPage(Map<String, Object> map);
}
